#include <iostream>
#include <unistd.h>
#include <signal.h>
using namespace std;

void handler(int signo)
{
    cout << "这是一个进程，刚刚获取了一个信号：" << signo << endl;
    // exit(1);
}

static void showPending(sigset_t *pendings)
{
    for (int sig = 1; sig <= 31; sig++)
    {
        if (sigismember(pendings, sig))
        {
            cout << "1";
        }
        else
        {
            cout << "0";
        }
    }
    cout << endl;
}
// test
int main()
{
    cout<<"pid: "<<getpid()<<endl;
    sigset_t bsig, obsig;
    sigemptyset(&bsig);
    sigemptyset(&obsig);
    // sigfillset();
    for (int sig = 1; sig <= 31; sig++)
    {
        // 添加2号信号到信号屏蔽字中
        sigaddset(&bsig, sig);
        signal(sig, handler);
    }
    // 设置用户记得信号屏蔽字到内核中，让当前进程屏蔽2号信号
    sigprocmask(SIG_SETMASK, &bsig, &obsig);

    // 1.不断获取当前进程的pending信号集
    sigset_t pendings;
    int cnt = 0;
    while (true)
    {
        // 清空信号集
        sigemptyset(&pendings);
        // 获取当前进程(谁调用，获取谁)的pending 信号集
        if (sigpending(&pendings) == 0)
        {
            // 打印一下当前进程的pending 信号集
            showPending(&pendings);
        }
        sleep(2);
        cnt++;
        if (cnt == 20)
        {
            cout << "解除对所有信号的block..." << endl;
            sigprocmask(SIG_SETMASK, &obsig, nullptr);
        }
    }
}


// //test3
//  int main()
//  {
//     while(1)
//     {
//         sleep(1);
//         cout<<"我是一个进程： "<<getpid()<<endl;
//     }
//  }